package com.hfb.mashibing.alip8.juc.c021_01_interview;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 程序在执行中，如果线程异常，默认情况会被释放
 * 所以，在并发处理中，有异常要多加小心，要不然会发生不一致的情况
 * 比如在web app处理过程中，多个servlet线程共同访问同一个资源，
 * 这个时候如果异常处理不合适；
 * 即，在第一个线程抛出异常，其他线程y会进入同步代码区
 * 有可能会访问到异常产生的数据，
 * 因此，要非常小心的处理同步代码块中的异常
 */
public class T01_MyContainer1<T> {
    final private List<T> lis = new LinkedList<T>();
    final private int MAX = 10;
    private int count = 0;

    public synchronized void put(T t){
        while (lis.size() == MAX) { // 想想为什么
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        lis.add(t);
        ++ count;
        this.notify(); // 通知消费者线程进行消费
    }
    public static void main(String[] args) {
        // 此处程序本意：t1永远执行，t2永远不执行
        // 此处程序实际运行：t1执行，异常，释放锁，t2趁机乱入读脏、乱入执行
        final T01_MyContainer1 t = new T01_MyContainer1();
        final Runnable r = () -> {
            t.m();
        };

        new Thread(r, "t1").start();
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(r, "t2").start();
    }
    public void m(){
        ++ count;
    }
}
